package com.xltq.entity;

import java.io.Serializable;
import java.math.BigDecimal;

/**
 * 数据库对应的购物车表
 */
public class Cart implements Serializable {

    private static final long serialVersionUID = 1L;

    private int cid;
    private int uid;
    private int pid;
    /**
     * 在购物车页面需要展示一些商品信息,所以就需要在购物车中提供对应商品列
     * 如果在设计表的时候这样做,就会出现数据冗余状态(购物车中存在商品信息和商品也存在商品信息)
     * 所以在开发中要避免这样的设计,所以就在购物车表中提供了一个商品表中的一个列,通过多表联合查询
     * 可以得到商品表中信息---> p_id--->商品表的主键列 作为购物车表 外键列存在
     *
     * 扩展一些:(购物车三大实现技术)
     * 简便购物车: 全局使用session进行数据存储和操作
     * 中规中矩购物车: 数据库设计购物车表进行操作(现在项目中)
     * 应对购物车大量使用状态:   cookie+redis设计购物车 -->mysql做服务数据存储
     *
     *通过设计表与表之间关系,确实让商品表和购物车表联系起来,通过表查询出来数据是在后台程序中进行存储和传递
     * 不会在一个张表中存储另外一张表的冗余数据信息的,换而言之在购物车的是以类中是允许使用另外一个类作为本类
     * 的一个属性存在,所以为了方便在代码中对数据表查询出来数据加以操作,所以在购物车的实体类我们就提供了一个属性
     * 这个属性就是商品表对应实体类的对象,为了方便存储查询得到数据
     *
     */
    private Product product;
    private int cnum = 0;  //购车商品数量
    private BigDecimal ccount; //购物车小计(使用商品价格*商品数据量)

    public Cart() {
    }
    //追加这些属性的get和set方法
    public int getCid() {
        return cid;
    }

    public void setCid(int cid) {
        this.cid = cid;
    }

    public int getUid() {
        return uid;
    }

    public void setUid(int uid) {
        this.uid = uid;
    }

    public int getCnum() {
        return cnum;
    }

    public void setCnum(int cnum) {
        this.cnum = cnum;
    }

    /**
     * 在获取购物车汇总Ccount属性是时候就相当于在获取购物车的小计值
     * 所以这里就将购物车中计算小计值进行计算
     * @return
     */
    public BigDecimal getCcount() {
        /*
        因为数据数据都是BigDecimal类型,所以需要使用BigDecimal计算
        需要使用BigDecimal中提供的计算方法来计算,不要使用运算符计算不支持
        如果需要使用BigDecimal做小数类型计算,在使用BigDecimal存储数据的时候,小数不是必须使用字符串类型
        才可以确定小数具体是多少,否则计算都过于精确的,如果将小数存储在BigDecimal中
        建议将小数转换为字符串例如:
        通过某种方式得到了一个double类型数据,要存在BigDecimal中
        double PI = 3.14;
        转换为字符串
        String strPI = PI+"";
        然后在存储在BigDecimal中
        BigDecimal bg = new BigDecimal(strPI);
        */
        BigDecimal pprice = product.getPprice();
        BigDecimal bigDecimal = new BigDecimal(cnum);
        return pprice.multiply(bigDecimal);
    }

    public void setCcount(BigDecimal ccount) {
        this.ccount = ccount;
    }

    public Product getProduct() {
        return product;
    }

    public void setProduct(Product product) {
        this.product = product;
    }

    public int getPid() {
        return pid;
    }

    public void setPid(int pid) {
        this.pid = pid;
    }

    @Override
    public String toString() {
        return "Cart{" +
                "cid=" + cid +
                ", uid=" + uid +
                ", cnum=" + cnum +
                ", ccount=" + ccount +
                '}';
    }


}
